空间数据结构在游戏程序中,利用空间数据结构加速计算往往是非常重要的优化思想,空间数据结构可以应用于场景管理、渲染、物理、游戏逻辑等方面link19.1 空间数据结构 - Justin的文章 - 知乎
四叉树/八叉树四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割
松散四叉树/八叉树:解决边界问题四叉树/八叉树的一个问题是,物体有可能在边界处来回,从而导致物体总是在切换节点,从而不得不更新四叉树/八叉树。
而松散四叉树/八叉树正是解决这种边界问题的一种方式:首先它定义一个节点有入口边界(inner boundary),出口边界(outerboundary)。那么如何判定一个物体现在在哪个节点呢?
若物体还没添加进四叉树/八叉树,则检测现在位于哪个节点的入口边界内;若物体先前已经存在于某个节点,则先检测现在是否越出该节点的出口边界,若越出再检测位于哪个节点的入口边界内。在非松散的四叉树/八叉树中,入...
Desc:花大钱买了块树莓派4B,折腾一下想了很久的嵌入式
初始化连了显示器后一直next,系统选择的是64位
远程vnc viewer
Gitlabgitlab
踩到的坑管理员账号密码link
台式无法链接树莓派有线网和无线网不在一个网段
SSH密钥保存在 C:\Users\Ruancuan.ssh 目录下
git clonegit@7e4e60542121:gitlab-instance-33113c43/game001.git在host中配置网址,或者直接手动替换git@7e4e60542121:gitlab-instance-33113c43/game001.git
git push网络代理原因导致link
Desc:碰撞检测是适用于碰撞处理的一部分,碰撞处理可以分为三个部分:碰撞检测,碰撞计算,碰撞响应。碰撞检测的结果通常是一个布尔量,它告知了是否存在两个或者更多的物体相撞;而碰撞计算求出物体间碰撞的实际交点;最终,碰撞响应决定针对两个物体的碰撞,该采取什么样的行动
优化的思路减少检测的数量通过四叉树或者八叉树,将地图分块,每次只检测当前角色附近区域的块
减少检测的计算将除角色外的物体视作静态,发射射线去检测碰撞
射线的碰撞检测一般通过向角色的下方位置发射射线去根据距离检测位置,如果是负的,说明需要向上,不适用于复杂的场景(角色发生旋转,这是不能通过脚的位置向下发出射线,需要不同方向发射不同射线)
动态BVH树的动态碰撞检测动态包围盒层次结构(Dynamic BVH)是一种数据结构,用于加速射线追踪等计算机图形学应用程序。它是一个树形结构,每个节点表示一组物体的包围盒,而叶节点表示单个物体的包围盒动态BVH树
BSP树的动态碰撞检测二叉空间分割树,在多边形剪切方面出色,在碰撞检测方面高速使用BSP进行碰撞检测的本质是减少了树的遍历和搜索,前期派出了大量的多边形,在最后仅仅对...
Desc:记录法线贴图的变更
法线映射非移动平台上,Unity会把法线贴图转换成 DXRT5nm 格式,只有两个有效通道 GA ,节省空间的优化移动平台上,RGB 通道
123456789101112131415161718fixed3 UnpackNormalmapRGorAG(fixed4 packednormal){ // This do the trick packednormal.x *= packednormal.w; fixed3 normal; normal.xy = packednormal.xy * 2 - 1; normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); return normal;}inline fixed3 UnpackNormal(fixed4 packednormal){#if defined(UNITY_NO_DXT5nm) return packednormal.xyz * 2 - 1;#else r...
Desc:Manifest储存着所有AB和AB之间的依赖关系
AssetsPathMapping包含着资源路径到AB的路径映射
1234567891011121314public class ResourcesMapItem{ public string assetbundleName; public string assetName;}//资源路径对应mapItemprotected Dictionary<string, ResourcesMapItem> pathLookup = new Dictionary<string, ResourcesMapItem>();//ab包对应的资源protected Dictionary<string, List<string>> assetsLookup = new Dictionary<string, List<string>>();//资源对应的ab包protected Dictionary<string, string&g...
Desc:用于减少场景中物体的数量
原理将地图分为存在上限的树,树每个非根节点可以最大存在四个子节点,物体如果存在两个及以上区域的时候,挂载在上一层节点上
实现接口INode.cs:Bounds bound{get;set;}// 初始化节点void InsertNodeData(NodeData data);// 在视角内,检查当前节点是否在摄像机裁剪区域内,不在则调用 Outside 回收void Inside(Camera camera);// 不在视角void Outside(Camera camera);// 编辑器模式下进行绘制void DrawBound();
类Node.cs:实现INode接口,定义深度和子节点
Tree.cs:定义最大层数
NodeData.cs:存储每个节点的数据,通过编辑器初始化
NodeManager.cs:持有当前场景中所有节点的引用,控制节点的加载和释放
QuadTreeManager.cs:在Update中,调用tree的Inside
方法:拓展 Bou...
Desc:思路:GrassBendingRTPrePass: 利用 TrailRender 组件,将自动淡出的运动轨迹渲染到一张 RT 上,作为草地交互的信息源
InstancedIndirectGrassPosDefine: 定义草生成的世界坐标
UpdateAllInstanceTransformBufferIfNeeded: 更新草生成所需要的基础信息 例如: 计算生成草范围的中心坐标 包围盒 草地分块等基础信息 传入 Shader 和 ComputeShader
GeometryUtility.CalculateFrustumPlanes: 根据设置的距离计算出 Camera 的六个裁剪平面
GeometryUtility.TestPlanesAABB: 通过每个草地块构建 Bound 进行 AABB 碰撞测试,测试通过才会加入可见的草地块进入渲染流程
CullingComputeShader.Dispatch: 按照可见的草地块索引使用 ComputeShader 对草地块中每棵...
Desc:皮肤渲染的渲染过程可由两个分量组成: 镜面反射+次表面散射
镜面反射项(specular reflection) 相对而言很简单,Gems 3中推荐Kelemen and Szirmay-Kalos specular BRDF用于皮肤镜面反射项的计算。因为Kelemen and Szirmay-Kalos specular BRDF在实现和Torrance-Sparrow模型一样的渲染效果时,计算量要小得多。而现阶段基于物理的一些其他高光模型或改进方案也应该会得到不错的效果
次表面散射麻烦很多
总纲
现在学会的方式:预积分的皮肤渲染(Pre-Integrated Skin Rendering)来源实现效果
贴图生成
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293...